#ifndef XLCOMM_NET_INETADDRESS_H_
#define XLCOMM_NET_INETADDRESS_H_

#include <netinet/in.h>
#include <stdint.h>

#include <string>

#include "xlcomm/copyable.h"
#include "xlcomm/define.h"

namespace xlcomm {
namespace net {

// 网络地址相关
class XLCOMM_API InetAddress : copyable {
 public:
  InetAddress();
  explicit InetAddress(const struct sockaddr& addr);
  explicit InetAddress(uint16_t port, const char* ip = "0.0.0.0");
  ~InetAddress();

  // 设置sockaddr_in类型数据
  void SetSockaddrIn(const struct sockaddr_in& addrin);
  // 从sockaddr类型转换
  void FromSockaddr(const struct sockaddr& addr);
  // 转换成sockaddr类型指针
  const struct sockaddr* ToSockaddr() const;

  // 地址族
  sa_family_t Family() const { return addrin_.sin_family; }
  // 转成"IP地址"字符串
  std::string ToIp() const;
  // 转成"IP地址:端口号"字符串
  std::string ToIpPort() const;
  // 端口号(主机字节序)
  uint16_t Port() const;
  // IPv4地址(网络字节序)
  uint32_t Ipv4NetEndian() const { return addrin_.sin_addr.s_addr; }
  // 端口号(网络字节序)
  uint16_t PortNetEndian() const { return addrin_.sin_port; }

 private:
  struct sockaddr_in addrin_;
};

}  // namespace net
}  // namespace xlcomm

#endif  // XLCOMM_NET_INETADDRESS_H_